namespace ConsoleApp1;

public class QuestionMark
{
    public void t1()
    {
        int? a = null;
        var aHasValue = a.HasValue;
    }

    //如果左操作数的值不为 null，则 null 合并运算符 ?? 返回该值；否则，它会计算右操作数并返回其结果。
    //如果左操作数的计算结果为非 null，则 ?? 运算符不会计算其右操作数。 仅当左操作数的计算结果为 null 时，Null 合并赋值运算符 ??= 才会将其右操作数的值赋值给其左操作数。
    //如果左操作数的计算结果为非 null，则 ??= 运算符不会计算其右操作数。
    public void t2()
    {
        List<int>? numbers = null;
        int? a = null;

        Console.WriteLine((numbers is null)); // expected: true
        // if numbers is null, initialize it. Then, add 5 to numbers
        (numbers ??= new List<int>()).Add(5);
        Console.WriteLine(string.Join(" ", numbers)); // output: 5
        Console.WriteLine((numbers is null)); // expected: false        


        Console.WriteLine((a is null)); // expected: true
        Console.WriteLine((a ?? 3)); // expected: 3 since a is still null 
        // if a is null then assign 0 to a and add a to the list
        numbers.Add(a ??= 0);
        Console.WriteLine((a is null)); // expected: false        
        Console.WriteLine(string.Join(" ", numbers)); // output: 5 0
        Console.WriteLine(a); // output: 0
    }
}